#include <iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
struct node
{
    LL p;
    LL c;
}a[N];
LL f[N];
LL n, S;
LL ret;
bool cmp(node& x, node& y)
{
    return x.c > y.c;
}
int main()
{
    cin >> n >> S;
    for (int i = 1;i <= n;i++)
    {
        cin >> a[i].p >> a[i].c;
        //对于成本我们进行前缀和处理
    }
    //首先按训练到满级的次数进行降序排序
    sort(a + 1, a + 1 + n, cmp);
    //思路：如果所有的都用统一训练其实有很多都是浪费了的，所以说我们得让浪费尽量变少
    //我们从左往右查找成本，当所有士兵都训练一次是成本和刚好大于S是，说明在这之前所有的士兵可以单个训练，反而更划算
    //对于这之后的，我们进行集体训练，训练次数是刚好把这个人升到满级
    //另外集体训练因为不限人数，所以必须把所有人都训练一遍
    int i = 0;
    long long ans = 0, sum = 0;
    //这个题需要注意的是前缀和一定是排序完之后再前缀和，不然用脚想也是错的啊！！！
    for (int i = 1; i <= n; i++) {
        if (sum + a[i].p >= S) {
            ans += a[i].c * S;
            ans -= a[i].c *sum; // 减去之前单个训练多加的金币
            break;
        }
        ans += a[i].c * a[i].p;
        sum += a[i].p;
    }
    cout << ans << '\n';
    //实际上刚刚好超的那里就是正确的那个点，不用再算后面了。因为再往后也是S划算，但是往后S使用的少了，肯定是不如这个
    //把错误写法留在这了
    ////此时的i就是刚刚好超的那个人
    //for (int j = i;j <= n;j++)
    //{
    //    ret = 0;
    //    ret += a[i].c * S;
    //    for (int k = 1;k < j;k++)//注意这个位置是k<j，别写成k<i
    //    {
    //        ret += a[k].p * (a[k].c - a[i].c);
    //    }
    //    ans = min(ans, ret);
    //}
    //cout << ans << endl;
    return 0;
}